/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia.controller

import persistencia.conexao.IConexao;
import persistencia.conexao.Conexao;
import groovy.sql.Sql;
import persistencia.controller.IFornecedorController;
import bean.Fornecedor;
import bean.BuscaChaveEstrangeira;
import org.postgresql.util.PSQLException;
import java.util.Vector;
import java.util.Map;

/**
 *
 * @author André
 */
class FornecedorController implements IFornecedorController{

    def boolean createFornecedor(Fornecedor fornecedor){
    
        try{
            Sql bd = Conexao.getInstance().getConexao();
        
            //def codigo = bd.execute("select nextval(\'compras.tfornecedor_tcod_fornecedor_seq\')");
            def cidade = fornecedor.getTcidadeFk();
            def classificacao = fornecedor.getTclassificacaoFiscalFk();
            def endereco = fornecedor.getTendereco();
            def fax = fornecedor.getTfax();
            def inscricao = fornecedor.getTinscricaoEstadual();
            def nome = fornecedor.getTnomeFantasia();
            def cnpj = fornecedor.getTnumCpfCnpj();
            def responsavel = fornecedor.getTpessoaResponsavel();
            def ramo = fornecedor.getTramoAtividade();
            def razao = fornecedor.getTrazaoSocial();
            def telefone = fornecedor.getTtelefone();

            def sql = "INSERT INTO compras.tfornecedor "+
                        "(trazao_social, tnome_fantasia, tnum_cpf_cnpj,"+
                        " tinscricao_estadual, tendereco, tclassificacao_fiscal_fk,"+
                        " ttelefone, tfax, tpessoa_responsavel, tramo_atividade, tcidade_fk)"+
              " VALUES (?,?,?,?,?,?,?,?,?,?,?)";

            def lista = [razao, nome, cnpj, inscricao, endereco, classificacao, telefone, fax,
                responsavel, ramo, cidade];

            bd.execute(sql, lista);
            return true;
        }
        catch(PSQLException e){
            System.err.println("PSQLException - FornecedorController.create(): " + e.getMessage());
            return false;
        }
        catch(Exception e){
            System.err.println("Exception - FornecedorController.create(): " + e);
            e.printStackTrace();
            return false;
        }
    }

    def Vector<Fornecedor> readFornecedor(String nomeFantasia){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            //def sql = "SELECT * FROM compras.tfornecedor WHERE tcod_fornecedor_pk = " + codigoFornecedor;
            def sql = "SELECT * FROM compras.tfornecedor WHERE tnome_fantasia ~* " + "'" + nomeFantasia + "'";
        
            Vector<Fornecedor> list = new Vector<Fornecedor>();
        
            bd.eachRow(sql){
                //result << it.toRowResult()
                list.add(new Fornecedor(it.toRowResult()));
            }
            if(list.isEmpty())
            list.add(new Fornecedor());  //não retorna NULL pq, até então, n acertei manipular NULL ou Fault corretamente no BPEL

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def Fornecedor readFornecedorPorId(Integer codigoFornecedor){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM compras.tfornecedor WHERE tcod_fornecedor_pk = " + codigoFornecedor;
            //def sql = "SELECT * FROM compras.tfornecedor";

            Vector<Fornecedor> list = new Vector<Fornecedor>();

            bd.eachRow(sql){
                //result << it.toRowResult()
                list.add(new Fornecedor(it.toRowResult()));
            }
            if(list.isEmpty())
            return new Fornecedor();    //não retorna NULL pq, até então, n acertei manipular NULL ou Fault corretamente no BPEL
                
            return list.get(0);
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def boolean updateFornecedor(Fornecedor fornecedor){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def codigo = fornecedor.getTcodFornecedorPk();
            def cidade = fornecedor.getTcidadeFk();
            def classificacao = fornecedor.getTclassificacaoFiscalFk();
            def endereco = fornecedor.getTendereco();
            def fax = fornecedor.getTfax();
            def inscricao = fornecedor.getTinscricaoEstadual();
            def nome = fornecedor.getTnomeFantasia();
            def cnpj = fornecedor.getTnumCpfCnpj();
            def responsavel = fornecedor.getTpessoaResponsavel();
            def ramo = fornecedor.getTramoAtividade();
            def razao = fornecedor.getTrazaoSocial();
            def telefone = fornecedor.getTtelefone();

            def sql = "UPDATE compras.tfornecedor SET " +
            "trazao_social = ?, tnome_fantasia = ?, tnum_cpf_cnpj = ?, tinscricao_estadual = ?, " +
            "tendereco = ?, tclassificacao_fiscal_fk = ?, ttelefone = ?, tfax = ?, " +
            "tpessoa_responsavel = ?, tramo_atividade = ?, tcidade_fk = ? " +
            "WHERE tcod_fornecedor_pk = ?";

            def lista = [razao, nome, cnpj, inscricao, endereco, classificacao, telefone, fax,
                responsavel, ramo, cidade, codigo];

            bd.executeUpdate(sql, lista);
            return true;
        }
        catch(PSQLException e){
            System.err.println("ERRO em FornecedorController.create() --> " + e.getMessage());
            return false;
        }
        catch(Exception e){
            System.err.println("ERRO em FornecedorController.create() --> " + e);
            e.printStackTrace();
            return false;
        }
    }

    def boolean deleteFornecedor(Integer codigoFornecedor){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "DELETE FROM compras.tfornecedor WHERE tcod_fornecedor_pk = ?";

            def lista = [codigoFornecedor];

            bd.execute(sql, lista);
            int count = bd.getUpdateCount();
            if(count == 1)
            return true;
            else if(count == 0)
            return false;
            else{
                System.err.println("FornecedorController erro não compreendido...");
                return false;
            }
        }
        catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }

    def Vector<BuscaChaveEstrangeira> searchClassificacaoPorId(String sigla){
        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM contabil.tclassificacao_fiscal WHERE " +
                      "tsigla_classificacao_fiscal ~* " + "'" + sigla + "'";
            //def sql = "SELECT * FROM compras.tfornecedor";

            Vector<BuscaChaveEstrangeira> list = new Vector<BuscaChaveEstrangeira>();

            bd.eachRow(sql){
                Map m = it.toRowResult();
                BuscaChaveEstrangeira fk = new BuscaChaveEstrangeira();
                fk.setId(m.tsigla_classificacao_fiscal);
                fk.setNome(m.tdescricao);

                list.add(fk);
            }
            if(list.isEmpty())
            return null;

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def Vector<BuscaChaveEstrangeira> searchClassificacaoPorNome(String descricao){
        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM contabil.tclassificacao_fiscal WHERE " +
                      "tdescricao ~* " + "'" + descricao + "'";
            //def sql = "SELECT * FROM compras.tfornecedor";

            Vector<BuscaChaveEstrangeira> list = new Vector<BuscaChaveEstrangeira>();

            bd.eachRow(sql){
                Map m = it.toRowResult();
                BuscaChaveEstrangeira fk = new BuscaChaveEstrangeira();
                fk.setId(m.tsigla_classificacao_fiscal);
                fk.setNome(m.tdescricao);

                list.add(fk);
            }
            if(list.isEmpty())
            return null;

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def Vector<BuscaChaveEstrangeira> searchCidadePorId(String cep){
        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM contas_a_receber.tcidade_cep WHERE " +
                      "tcidade_cep ~* " + "'" + cep + "'";
            //def sql = "SELECT * FROM compras.tfornecedor";

            Vector<BuscaChaveEstrangeira> list = new Vector<BuscaChaveEstrangeira>();

            bd.eachRow(sql){
                Map m = it.toRowResult();
                BuscaChaveEstrangeira fk = new BuscaChaveEstrangeira();
                fk.setId(m.tcidade_cep);
                fk.setNome(m.tnome_cidade);

                list.add(fk);
            }
            if(list.isEmpty())
            return null;

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def Vector<BuscaChaveEstrangeira> searchCidadePorNome(String nome){
        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM contas_a_receber.tcidade_cep WHERE " +
                      "tnome_cidade ~* " + "'" + nome + "'";
            //def sql = "SELECT * FROM compras.tfornecedor";

            Vector<BuscaChaveEstrangeira> list = new Vector<BuscaChaveEstrangeira>();

            bd.eachRow(sql){
                Map m = it.toRowResult();
                BuscaChaveEstrangeira fk = new BuscaChaveEstrangeira();
                fk.setId(m.tcidade_cep);
                fk.setNome(m.tnome_cidade);

                list.add(fk);
            }
            if(list.isEmpty())
            return null;

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
    
}